#include <iostream>
#include <string>
#include <cstring>
#include <mysql/mysql.h>

int main()
{
    //std::cout<<"mysql client version is "<<mysql_get_client_info()<<std::endl;

    //1.mysql初始化
    MYSQL* mysql=mysql_init(nullptr);
    if(mysql==nullptr)
    {
        printf("mysql init error,%s\n",strerror(errno));
        exit(1);
    }

    //2.mysql连接
    std::string host="127.0.0.1";
    std::string user="JK";
    std::string passwd="jiangJIANG010513";
    std::string db="connection";
    unsigned int port=3306;
    if(mysql_real_connect(mysql,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0)==nullptr)
    {
        printf("mysql connect error,%s\n",strerror(errno));
        exit(2);
    }

    //3.设置默认字符集
    mysql_set_character_set(mysql,"utf8");
    printf("mysql connect success\n");
    while(true)
    {
        std::string messages;
        std::getline(std::cin,messages);
        if(messages=="quit") break;
        int n=mysql_query(mysql,messages.c_str());//执行sql语句
        size_t pos=messages.find("select");
        if(pos!=std::string::npos&&n==0)
        {
            //对查询结果进行解析
            MYSQL_RES* res=mysql_store_result(mysql);
            if(res==nullptr)
            {
                exit(0);
            }
            int rows=mysql_num_rows(res);//获取查询结果行数
            int fields=mysql_num_fields(res);//获取查询结果列数
            MYSQL_FIELD* fname=mysql_fetch_field(res);//获取列名
            for(int i=0;i<fields;i++)
            {
                std::cout<<fname[i].name<<"\t|\t";
            }
            std::cout<<std::endl;

            //显示查询结果
            MYSQL_ROW line;//可以理解为一个char* 的数组
            for(int i=0;i<rows;i++)
            {
                line=mysql_fetch_row(res);//按行获取文件的内容，自动会更新行数
                for(int j=0;j<fields;j++)
                {
                    std::cout<<line[j]<<"\t|\t";
                }
                std::cout<<std::endl;
            }
            printf("%d rows in set\n",rows);
            mysql_free_result(res);
        }
        else
        {
            std::cout<<"execl sql: "<<mysql<<" done"<<std::endl;
        }
    }
    mysql_close(mysql);
    return 0;
}